	.text
fib:
	
	// jump to if_lt0 first
	jmp		35						// 1, PC = 0
									// this is the instruction, 
									// pc is 0 at this point
	
///////////////////////////////////////////////////////////////////////////////
// else return fib(n-1) + fib(n-2);

else:
	sub		%l0, 1, %l0				// 2
	call	fib						// 3, 4, 5 (PC = 4), 6 (PC = 5)
	mov		%rv, %l1				// 7
	
	sub		%l0, 2, %l0				// 8
	call 	fib						// 9, 10, 11, 12 
	mov		%rv, %l2				// 13
		
	// return fib(n-1) + fib(n-2);
	add		%l1, %l2, %rv			// 14
	return							// 15, PC = 14	

///////////////////////////////////////////////////////////////////////////////
// else if (n == 49) return 7778742049;
// 7778742049 = 1 1100 1111 1010 0110 0010 1111 0010 0001 = 33 bits
// 0x1CFA62F21

if_49:
	// else if (n == 49)
	mov		49, %l1					// 16
	bne		%l0, %l1, else			// 17, PC = 16			
	
	// return 7778742049;
	mov		0x1CFA62F21, %rv		// 18
	return							// 19, PC = 18
	
///////////////////////////////////////////////////////////////////////////////
// else if (n == 48) return 4807526976;
// 4807526976 = 1 0001 1110 1000 1101 0000 1010 0100 0000 = 33 bits
// 0x11E8D0A40

if_48:
	// else if (n == 48)
	mov		48, %l1					// 20
	bne		%l0, %l1, if_49			// 21, PC = 20

	// return 4807526976;
	mov		0x11E8D0A40, %rv		// 22
	return							// 23, PC = 22

///////////////////////////////////////////////////////////////////////////////
// else if (n == 30) return 832030;
// 832030 = 1100 1011 0010 0001 1110 = 20 bits
// 0xCB21E

if_30:
	// else if (n == 30)
	mov		30, %l1					// 24
	bne		%l0, %l1, if_48			// 25

	// return 832030;
	mov		0xCB21E, %rv			// 26
	return							// 27, PC = 26
	
///////////////////////////////////////////////////////////////////////////////
// else if (n == 29) return 514229;
// 514229 = 111 1101 1000 1011 0101 = 19 bits
// 0x7D8B5

if_29:
	// else if (n == 29)
	mov		29, %l1					// 28
	bne		%l0, %l1, if_30			// 29, PC = 28

	// return 514229;
	mov		0x7D8B5, %rv			// 30
	return							// 31, PC = 30
	
///////////////////////////////////////////////////////////////////////////////
// else if (n <= 2) return 1;
// 1

if_lte2:
	// else if (n <= 2)
	mov		2, %l1					// 32
	bg		%l0, %l1, if_29			// 33, PC = 32

	// return 1			
	mov		1, %rv					// 34
	return							// 35, PC = 34
	
///////////////////////////////////////////////////////////////////////////////

if_lt0:
	// if(n < 0)
	mov		0, %l1					// 36
	bge		%l0, %l1, if_lte2		// 37, PC = 36
	
	// return 0x3DEADBEEF
	mov		0x3DEADBEEF, %rv		// 38
	return							// 39


	
	